// 封装返回给前端的数据
const jwt = require('jsonwebtoken')

let CODE = {
    SUCCESS: 200,
    PARAM_ERROR: 10001, //参数错误
    USER_ACCOUNT_ERROR: 201, //账号密码或验证码错误
    USER_LOGIN_ERROR: 30001, //用户未登录
    BUSINESS_ERROR: 40001,//认证失败或TOKEN过期
    AUTH_ERROR: 50001  //业务请求失败
}

module.exports = {
    //封装页面数据函数
    pager({ currentPage = 1, pageSize = 10 }) {
        let currentpage = currentPage * 1//转为数字
        let pagesize = pageSize * 1//转为数字
        const skipIndex = (currentpage - 1) * pagesize//跳过多少条数据
        return {
            page: { currentpage, pagesize }, skipIndex
        }
    },
    //修改menu列表数组格式  转换成树形结构
    TreeMenuList(data) {
        let result = []//要返回到数组
        let map = {}//声明一个对象做映射关系
        data.forEach(item => {
            map[item._id] = item//把数组里面的对象以_id为键，数组中的对象为值存到map对象中
        })
        data.forEach(item => {
            //item.parentId数组储存父级菜单的id
            let k = item.parentId.slice().pop()//获取parentId数组最后一个元素     k = '646c18e6b170f7b10befe2f5'  || null
            let parent = map[k]//获取map对象中k对应的值 没有则为undefined
            if (parent) {//如果parent有值 则说明有父级关系
                (parent.children || (parent.children = [])).push(item) //如果parent有children，就push，如果没有，就创建一个children数组并push
                if (parent.component == '') {
                    (parent.action || (parent.action = [])).push(item) //如果parent的component为空，说明为一级菜单，就创建一个action数组并push(双重验证)
                }
            } else {
                result.push(item) //如果parent没有值，说明item是一级菜单，直接push到result数组中
            }
        })
        return result//返回树形结构的数组
    },
    //解构请求头中的token
    decoded(Authorization) {
        if (Authorization) {//如果Authorization存在
            let token = Authorization.split(' ')[1]//split转为数组  分割出token
            return jwt.verify(token, 'hai')//jwt.verify()验证token  第二个参数为密钥
        }
    },
    //时间格式化函数(扒的)
    formatDate(date, format) {
        const padZero = (num) => (num < 10 ? '0' + num : num);
        const year = date.getFullYear();
        const month = padZero(date.getMonth() + 1);
        const day = padZero(date.getDate());
        const hour = padZero(date.getHours());
        const minute = padZero(date.getMinutes());
        const second = padZero(date.getSeconds());
        //replace() 方法用于在字符串中用一些字符替换另一些字符，或替换一个与正则表达式匹配的子串。
        return format
            .replace('YYYY', year)
            .replace('MM', month)
            .replace('DD', day)
            .replace('HH', hour)
            .replace('mm', minute)
            .replace('ss', second);
    },
    //返回成功的数据
    success(data = "", msg = "ok", code = CODE.SUCCESS) {
        return {
            code,
            msg,
            data
        }
    },
    //返回失败的数据
    fail(data = "", msg = "fail", code = CODE.AUTH_ERROR) {
        return {
            code,
            msg,
            data
        }
    },
    //token超时或错误
    tokenErr(data = "", msg = "fail", code = CODE.BUSINESS_ERROR) {
        return {
            code,
            msg,
            data
        }
    },
    //登陆失败
    loginErr(data = "", msg = "fail", code = CODE.USER_ACCOUNT_ERROR) {
        return {
            code,
            msg,
            data
        }
    }
}